
#include "display.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 1024

//Divers :
/**FUNCTION*******************************************/
//-V, --version afficher le nom et la version du logiciel
void displayVersion()
{
}

/**FUNCTION*******************************************/
//--help afficher l'aide et quitter
void displayHelp()
{
    printf("help!\n");
}

/**FUNCTION*******************************************/
//-n, --line-number         print line number with output lines
void displayLineNumber(const result_t* pRes)
{
    if( pRes )
    {
        printf("%d:", pRes->lineNumber_ );
    }
}

/**FUNCTION*******************************************/
//--line-buffered       flush output on every line

/**FUNCTION*******************************************/
//-H, --with-filename       print the file name for each match
void displayFileName(const result_t* pRes)
{
    if( pRes )
    {
        printf("%s:", pRes->fileName_ );
    }
}

/**FUNCTION*******************************************/
//-h, --no-filename         suppress the file name prefix on output
void displayNoFileNamePrefix(const result_t* pRes)
{
}

/**FUNCTION*******************************************/
//    --label=LABEL         use LABEL as the standard input file name prefix
void displayLabel(const result_t* pRes, const char* pLabel)
{
}

/**FUNCTION*******************************************/
//-o, --only-matching       affiche la partie de ligne seule concordant avec MOTIF
void displayOnlyMatching(const result_t* pRes, const char* pStrToMatch)
{
}

/**FUNCTION*******************************************/
//-L, --files-without-match affiche seulement les noms de fichiers sans concordances
void displayNotMatchingFiles(const result_t* pRes)
{
}

/**FUNCTION*******************************************/
//-l, --files-with-matches affiche seulement les noms de fichiers avec concordances
void displayMatchingFiles(const result_t* pRes)
{
}

/**FUNCTION*******************************************/
//-c, --count affiche seulement le compte des lignes concordantes par fichier
void displayCount(const result_t* pRes)
{
}

/**FUNCTION*******************************************/
//-T, --initial-tab	insérer des tabulations (si besoin)
void displayTab()
{
    printf("\t");
}

/**FUNCTION*******************************************/
//-Z, --null sort l'octet 0 après le nom de fichier


/**FUNCTION*******************************************/
//-B, --before-context=NUM 	affiche NUM lignes de contexte avant
void displayContextBefore(int pNum, char* pPath, int pLineNumber, arg_t* pArgs)
{
    FILE * file = fopen(pPath, "r");
    char* line = malloc(sizeof(char) * MAX_SIZE);
    int lineNumber = 0;
    if (file != NULL)
    {
        while( (pLineNumber-pNum) < 0 ) //Allow not to print before the first line
        {
            pNum--;
        }

        while( NULL != fgets(line, MAX_SIZE, file) )
        {
            ++lineNumber;
            if( lineNumber == (pLineNumber-pNum) )
            {
                if( !pArgs->trigger_h )
                {
                    printf("%s:", pPath);
                }

                if( pArgs->trigger_n )
                {
                    printf("%i:", pLineNumber-pNum);
                }

                printf("%s", line);

                if (0 != pNum)
                {
                    pNum--;
                }
            }
        }
    }
    printf("----------------------------------------------------------------\n");
}

/**FUNCTION*******************************************/
//-A, --after-context=NUM 	affiche NUM lignes de contexte après
void displayContextAfter(int pNum, char* pPath, int pLineNumber, arg_t* pArgs)
{
    FILE * file = fopen(pPath, "r");
    char* line = malloc(sizeof(char) * MAX_SIZE);
    int lineNumber = 0;
    int number = 0;
    if (file != NULL)
    {
        while( NULL != fgets(line, MAX_SIZE, file) )
        {
            ++lineNumber;
            if( lineNumber == (pLineNumber+number) )
            {
                if( !pArgs->trigger_h )
                {
                    printf("%s:", pPath);
                }

                if( pArgs->trigger_n )
                {
                    printf("%i:", pLineNumber+number);
                }

                printf("%s", line);

                if (pNum != number)
                {
                    number++;
                }
            }
        }
    }
}

/**FUNCTION*******************************************/
//-C, --context=NUM 		affiche NUM lignes de contexte en sortie
void displayContextOutput(int pNum, char* pPath, int pLineNumber, arg_t* pArgs)
{
    FILE * file = fopen(pPath, "r");
    char* line = malloc(sizeof(char) * MAX_SIZE);
    int lineNumber = 0;
    int numberBefore = pNum;
    int numberAfter = 0;
    if (file != NULL)
    {
        while( (pLineNumber-numberBefore+numberAfter) < 0)
        {
            numberBefore--;
        }
        while( NULL != fgets(line, MAX_SIZE, file) )
        {
            ++lineNumber;
            if( lineNumber == (pLineNumber-numberBefore+numberAfter) )
            {

                if( !pArgs->trigger_h )
                {
                    printf("%s:", pPath);
                }

                if( pArgs->trigger_n )
                {
                    printf("%i:", pLineNumber-numberBefore+numberAfter);
                }
                printf("%s", line);

                if (0 != numberBefore)
                {
                    numberBefore--;
                }
                if (pNum != numberAfter)
                {
                    numberAfter++;
                }
            }
        }
    }
}

/**FUNCTION*******************************************/
//-NUM 				comme --context=NUM

/**FUNCTION*******************************************/
//	--color[=QUAND], --colour[=QUAND] met en évidence les concordances
//			QUAND vaut "always" (toujours), "nevers" (jamais) ou "auto"
void displayColor(const result_t* pRes)
{
}

